智慧合約部署的意義在於,建立一個新的合約 account。部署完使用者才能和這個新的合約 account 互動。習慣寫 JavaScript 的同學可能比較少會去想到程式「部署」的問題。而「合約部署」在合約程式開發中,算是一開始比較難理解的步驟。因為不知道合約是部署到哪裡去了。在 Remix IDE 中只有假的環境,就是 Remix VM,用 JavaScript 寫出來的 VM。大家比較不能理解為什麼合約會需要這個部署的動作。
一般寫 JavaScript 程式不需要 compile 編譯,因為他是直譯式語言。史丹佛網站介紹 JavaScript 的時候就有寫,"JavaScript is an interpreted language, not a compiled language."。程式寫完就直接跑。但 Javascript 有「部署」這個動作。比如說,一個網站 host 在 GitHub 的 server,部署到這個 server,使用者才能在網路上使用你的 JavaScript 程式。
使用者要怎麼和你寫好的智能合約程式互動?畢竟他不是部署在某一個 GitHub server。合約事實上是部署到以太坊的 p2p 網路。這個觀念的理解,涉及以太坊資料的讀寫 R/W,read and write。例如,一筆資料怎麼記在以太坊 p2p 網路上?使用者要怎麼讀出這筆資料?怎麼在以太坊 p2p 網路讀寫資料、交易的生命週期、區塊怎麼打包的、節點怎麼同步等等。
回答「合約是部署到哪裡?」,Deploy 部署合約後,就是部署到以太坊的 p2p 網路。以太坊的 world state 會增加一個 contract address。這個 contract address 對應到 contract account。contract account 有四個資料欄位,nonce、balance、bytecode、storage。bytecode 就是剛剛 compiled 編譯完的一團 bytecode。產完一團 bytecode 接著要發一筆部署合約的交易。Validator 驗證者會打包區塊,也就是把交易打包到區塊裡,並 broadcasting 發布區塊。合約部署後,使用者要與合約互動。使用者需要發一筆與合約互動的交易。